﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using RFServer.Functions;
using RFServer.ServiceWCF;

namespace RFServer.Interactive
{
    public partial class InteractiveInsert : Form
    {
        public enum KIND { FILE, DIRECTORY, CATEGORY };

        private string filename;
        private KIND kind;

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="filename">Имя путь к файлу</param>
        /// <param name="kind">Тип объекта</param>

        public InteractiveInsert(string filename)
        {
            InitializeComponent();

            this.filename = filename;

            // DropBox

            if (Directory.Exists(Setup.DropBoxDirectory) && Setup.DropBoxInUse)
                if (Setup.InDropBox(filename))
                {
                    lblHint.Text = "Файл расположен в каталоге DrobBox и\n" +
                        "будет доступен другим пользователям аккаунта DropBox";
                    lblHint.ForeColor = Color.Black;
                }

            // Установка порта и IP-адреса

            txtServerIP.Items.Clear();
            txtServerIP.Items.Add(Setup.ServiceLocalAddress);
            txtServerIP.SelectedIndex = 0;
            txtFilename.Text = filename;
            txtTags.Clear();
        }

        private bool TagExists(string tag)
        {
            /* Проверка тэга на существование */

            bool result = false;

            try
            {
                ILocalService service = LocalService.Connect();

                if (service == null)
                    throw new Exception("Невозможно соединиться по NetPipe");

                result = service.TagExists(tag);
                LocalService.Disconnect(service);
            }
            catch (Exception)
            {
                /* Ошибку можно не обрабатывать, так как результат  */
                /* функции все равно равен false                    */
            }

            return result;
        }

        private bool DefineKind()
        {
            try
            {
                if (File.Exists(filename))
                    kind = KIND.FILE;
                else if (Directory.Exists(filename))
                    kind = KIND.DIRECTORY;
                else if (TagExists(filename))
                    kind = KIND.CATEGORY;
                else
                    throw new Exception("Файл '" + filename + "' не найден");

                // По типу объекта показываем информацию

                switch (kind)
                {
                    case KIND.FILE:
                        gbFileInfo.Text = " Информация о файле "; break;
                    case KIND.DIRECTORY:
                        gbFileInfo.Text = " Информация о директории "; break;
                    case KIND.CATEGORY:
                        gbFileInfo.Text = " Информация о категории "; break;
                }

                // Тип определился

                return true;
            }
            catch (Exception)
            {
                Error.Show("Параметр '" + filename + "' не является файлом, каталогом или категорией");
            }

            // Тип не определен

            return false;
        }

        private void CancelInsert(object sender, EventArgs e)
        {
            Close();
        }

        private void Insert(object sender, EventArgs e)
        {
            /* Считываем параметры для комнады */

            char[] seps = { ',', '\n', '\t' };
            string[] tags = txtTags.Text.Split(seps);
            string skind = "";

            for (int i = 0; i < tags.Length; i ++)
                tags[i] = tags[i].Trim();

            switch (kind)
            {
                case KIND.FILE: skind = "FILE"; break;
                case KIND.DIRECTORY: skind = "DIRECTORY"; break;
                case KIND.CATEGORY: skind = "CATEGORY"; break;
            }

            /* Формируем команду */

            List<string> command = new List<string>(tags);
            command.Add(skind);
            command.Add(filename);

            /* Выполнение команды */

            try
            {
                ILocalService service = LocalService.Connect();

                if (service == null)
                    throw new Exception("Невозможно соединиться по NetPipe");

                service.Insert(command.ToArray());
                LocalService.Disconnect(service);

                Close();
            }
            catch (Exception ex)
            {
                Error.Show("Ошибка при добавлении объекта", ex);
            }
        }

        private void LoadItemTags(object sender, EventArgs e)
        {
            if (!DefineKind())
            {
                Close();
                return;
            }

            // Загружаем категории выбранного объекта

            string[] command = { filename };
            string[] tags = null;

            /* Выполнение команды */

            try
            {
                ILocalService service = LocalService.Connect();

                if (service == null)
                    throw new Exception("Невозможно соединиться по NamedPipe");

                tags = service.Tags(command);
                LocalService.Disconnect(service);
            }
            catch (Exception ex)
            {
                Error.Show("Ошибка при получении категорий объекта", ex);
            }

            /* Отображаем тэги */

            if (tags == null)
                return;

            for (int i = 0; i < tags.Length; i++)
            {
                string tag = tags[i].Split('?')[0];

                txtTags.Text += tag;

                if (i < tags.Length - 1)
                    txtTags.Text += ", ";
            }

            /* Устанавливаем фокус для удобства пользователя */

            txtTags.Focus();
            txtTags.DeselectAll();
        }

        private void txtTags_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.Enter)
                Insert(sender, e);
        }
    }
}
